package ru.pb.auth.network.engine.auth.packets.sendable;

import java.util.Collection;

import ru.pb.auth.data.xml.holders.GameServersHolder;
import ru.pb.auth.model.GameServerInfo;
import ru.pb.auth.network.clients.AuthClient;
import ru.pb.auth.network.engine.auth.packets.AuthServerToAuthClientPacket;

/**
 * @author Felixx
 *         <br><br>
 *         4 байта<br>
 *         4 байта<br>
 *         2 байта<br>
 *         2 байта<br>
 *         10 байт<br>
 *         1 байт<br>
 *         4 байта с количеством циклов<br>
 *         Цикл из 17 байтов Из колва ранее прочитаного<br>
 *         2 байта сколичеством второго цикла<br>
 *         Цикл второй состоит из чтения 2 байта 4 байта 4 байта<br>
 *         Читаем 1 байт в котором количкство еще одного цикла<br>
 *         Далее чтение цикла кусками по 12 байт<br>
 *         Причем в этом цикле в этих 12 байтах идет тип чегото<br>
 */
public final class PROTOCOL_BASE_GET_SCHANNELLIST_ACK extends AuthServerToAuthClientPacket
{
	private Collection<GameServerInfo> _gameservers;
	private AuthClient _client;

	public PROTOCOL_BASE_GET_SCHANNELLIST_ACK(AuthClient client)
	{
		_gameservers = GameServersHolder.getInstance().getGameServers();
		_client = client;
	}

	@Override
	public void writeImpl()
	{
		writeH(2049); // опкод
		writeD(_client.getId()); // 5404
		writeB(_client.getIPBytes()); // 74.115.1.94
		writeH(_client.getCryptKey());
		writeH(_client.hashCode()); // 32759

		// Каналы. На руофе все = 1
		for(int i = 0; i < 10; i++)
		{
			writeC(1);
		}

		writeC(1); // ХЗ постоянное, может - кол -во ЛСов?

		int count1 = _gameservers.size(); // Кол-во серверов
		writeD(count1); // Скока показывать? ID = 0 Всегда скрыт!

		for(GameServerInfo info : _gameservers)
		{
			if(info != null)
			{
				writeBoolD(info.isAuthed());// доступен или нет
				writeB(info.getIPAddressForPlayer(getClient().getIPString())); // хост
				writeH(info.getPort()); // порт гейма
				writeC(info.getType().get()); // тип сервера (5-Для опытных, общий)
				writeH(info.getMaxPlayers()); // Максимально персов на сервере 4000
				writeD(info.getCurrentPlayerCount()); // Сколько персов на сервере
			}
		}

		int count2 = 0; // ХЗ небыло пока > 0
		writeH(count2);
		for(int i = 0; i < count2; i++)
		{
			writeH();
			writeD();
			writeD();
		}

		int count3 = 1; // ХЗ на руоффе тут 1
		writeC(count3);
		for(int i = 0; i < count3; i++)
		{
			writeB(new byte[12]); // Всегда в конце нули. Руофф.
		}
	}
}